// DbGet.h
#pragma once

#include <string>
#include "../DbClient/DbClient.h" 
#include "../../generated/common_struct.pb.h"

// 定义 Get 操作的可能结果
enum class GetResult {
    Error,    // 数据库操作失败 (例如连接错误, 查询错误)
    NotFound, // 数据库操作成功，但未找到指定节点/关系
    Found     // 数据库操作成功，且找到了指定节点/关系
};

class DbGet {
public:
    // 禁止实例化
    DbGet() = delete;

    /**
     * @brief 在 Neo4j 数据库中根据 ID 获取一个 (:User) 节点。
     * 
     * @param user_id 要获取的用户的ID。
     * @param user_node (输出) 如果找到，填充此 UserNode 对象。
     * @param error_message (输出) 如果操作失败（Error状态），此字符串将包含描述错误的信息。
     * @return GetResult 操作结果。
     *         GetResult::Found: 成功找到节点，user_node 已被填充。
     *         GetResult::NotFound: 成功执行查询，但未找到节点。
     *         GetResult::Error: 数据库操作失败，error_message 包含错误详情。
     */
    static GetResult GetUser(int32_t user_id, ::graph::UserNode& user_node, std::string& error_message);

    /**
     * @brief 在 Neo4j 数据库中根据 ID 获取一个 (:List) 节点。
     * 
     * @param list_id 要获取的列表的ID。
     * @param list_node (输出) 如果找到，填充此 ListNode 对象。
     * @param error_message (输出) 如果操作失败（Error状态），此字符串将包含描述错误的信息。
     * @return GetResult 操作结果。
     */
    static GetResult GetList(int32_t list_id, ::graph::ListNode& list_node, std::string& error_message);

    /**
     * @brief 在 Neo4j 数据库中根据 ID 获取一个 (:Todo) 节点。
     * 
     * @param todo_id 要获取的待办事项的ID。
     * @param todo_node (输出) 如果找到，填充此 TodoNode 对象。
     * @param error_message (输出) 如果操作失败（Error状态），此字符串将包含描述错误的信息。
     * @return GetResult 操作结果。
     */
    static GetResult GetTodo(int32_t todo_id, ::graph::TodoNode& todo_node, std::string& error_message);

    /**
     * @brief 在 Neo4j 数据库中根据 ID 获取一个 (:Comment) 节点。
     * 
     * @param comment_id 要获取的评论的ID。
     * @param comment_node (输出) 如果找到，填充此 CommentNode 对象。
     * @param error_message (输出) 如果操作失败（Error状态），此字符串将包含描述错误的信息。
     * @return GetResult 操作结果。
     */
    static GetResult GetComment(int32_t comment_id, ::graph::CommentNode& comment_node, std::string& error_message);

    /**
     * @brief 在 Neo4j 数据库中根据 ID 获取一个 (:Entity) 节点。
     * 
     * @param entity_id 要获取的实体的ID (字符串类型)。
     * @param entity_node (输出) 如果找到，填充此 EntityNode 对象。
     * @param error_message (输出) 如果操作失败（Error状态），此字符串将包含描述错误的信息。
     * @return GetResult 操作结果。
     */
    static GetResult GetEntity(const std::string& entity_id, ::graph::EntityNode& entity_node, std::string& error_message);

private:
    // 辅助函数：将存储的字符串拆分为 repeated 字段
    static void split_string_to_repeated(const std::string& str, const std::string& delimiter, ::google::protobuf::RepeatedPtrField<std::string>* repeated_field);
    
};
